<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    // 创建对象原型
    // Object.creater(创建对象的原型对象,对象形式的配置项)
    // 参数1 创建对象的原型，表示要继承的对象
    // 参数2 (可选) 也是一个对象，用于对新创建的对象进行初始化
    // 返回值 是一个新对象,带着指定的原型对象和属性.


    // 1. 直接创建对象
    var obj = Object.create({ name: 'theshy', age: 18 })
    console.log(obj);
    // __proto__  和 [[prototype]] 是一样的。
    //  下划线 _  [[]] 书写私有属性，不希望直接更改。
    // obj.__proto__.name = "" //这样写不规范


    // 2.配置参数创建对象
    // 对象的属性 是可控制的

    // 注意  如果第一个参数的值不是null或者对象,会报错.
    var obj = Object.create(null, {
      name: {
        value: 'theshy',
        writable: true,      //配置对象 属性可写
        enumerable: true,    //可枚举 是否可以被循环
        configurable: true   //是否能够删除，是否能够被修改 默认是false 不可被配置
      },
      age: {
        value: '20',
        writable: true,      //配置对象 属性可写
        enumerable: true,    //可枚举 是否可以被循环
        configurable: true   //是否能够删除，是否能够被修改
      }
    })
    console.log(obj);

    // writable：是否可写；默认不可写；
    obj.name = "李四";
    console.log(obj);
    // enumerable : 是否可以循环 ,默认是false 不可枚举，不可循环
    for (var key in obj) {
      console.log(key);
    }
    // configurable :  是否能够删除，是否能够被修改
    delete obj.name;
    console.log(obj);


    // 3.通过存储器来配置对象
    // 这种方法配置对象的优势 获取和更新属性时 都能监测到

    var obj = Object.create(null, {
      name: {
        // getter  
        get: function () {
          console.log("调用了get函数");
          // 获取name属性值的时候 自动调用get方法
          return "张三";
        },
        // setter
        set: function (newvalue) {
          // 设置name属性的时候会自动调用set方法
          console.log("修改了", newvalue)
        },
        configurable: true,
        enumerable: true
      }
    })
    console.log(obj);
    obj.name;  // 获取name值 ，调用get函数
    // setTimeout(function () {
    //   obj.name = "李四"; // 设置name的值 ；调用set 函数
    // }, 2000);





  </script>
</body>

</html>